/*

坐标压缩问题。

卡点：
开始时候，想到了将每个坐标的x和y进行排序，试过保存原来的坐标，但是最终没有解决问题。
看完题解发现，题目给的坐标点是“有序”的！我没有发现！就是第i个输入的坐标a1和第i+1个输入的a2，a1和a2要么同行，要么a1在a2上面！这是没发现的
所有，我们在输入的同时，还要保存坐标的输入次序！

*/

#include<bits/stdc++.h>
using namespace std;

const int maxn=1e5+5;

struct Node
{
    int x,y,id;
}node[maxn];
bool cmd1(Node a,Node b){return a.x<b.x;}
bool cmd2(Node a,Node b){return a.y<b.y;}

int ans1[maxn],ans2[maxn],g[maxn];

int main()
{
    int n,m,k;
    cin >> n >> m >> k;

    for(int i=1;i<=k;i++)cin >> node[i].x >> node[i].y,node[i].id=i;

    sort(node+1,node+k+1,cmd1);

    //此时node[].x已经排过序了
    for(int i=1,j=0;i<=k;i++)
    {
        g[i]=g[i-1]+(node[i].x!=node[i-1].x);//如果前后x坐标相同，则g[i]=g[i-1];否则，g[i]=f[i-1]+1(肯定相邻)
        while(j<k&&node[j+1].x<node[i].x)j++;//找到第j个比node[i].x大或者相同的坐标j停下,
        ans1[node[i].id]=g[j]+1;//g[]储存压缩过的k个x/y坐标
    }

    //对于y，重复之前的操作
    sort(node+1,node+k+1,cmd2);

    for(int i=1,j=0;i<=k;i++)
    {
        g[i]=g[i-1]+(node[i].y!=node[i-1].y);
        while(j<k&&node[j+1].y<node[i].y)j++;
        ans2[node[i].id]=g[j]+1;
    }

    for(int i=1;i<=k;i++)
    {
        printf("%d %d\n",ans1[i],ans2[i]);
    }
    return 0;
}

